当前位置: PHP > swoole > Swoole和hyperf

Swoole和hyperf

2021-08-28 分类:swoole 作者:admin 阅读(21)

SWoole

Swoole 是一个使用 C++ 语言编写的基于异步事件驱动和协程的并行网络通信引擎。

在 Swoole4+ 下所有的业务代码都是同步写法,完全没有心智负担,符合人类思维习惯,但同步的写法底层可能有同步IO/异步IO 之分。

无论是同步 IO / 异步 IO,Swoole/Server 都可以维持大量 TCP 客户端连接 (参考 SWOOLE_PROCESS 模式)。你的服务是阻塞还是非阻塞不需要单独的配置某些参数,取决于你的代码里面是否有同步 IO 的操作。

由于 PHP 语言不支持多线程,因此 Swoole 使用多进程模式,在多进程模式下存在进程内存隔离,在工作进程内修改 global 全局变量和超全局变量时,在其他进程是无效的。

什么是同步 IO:

简单的例子就是执行到 MySQL->query 的时候,这个进程什么事情都不做,等待 MySQL 返回结果,返回结果后再向下执行代码,所以同步 IO 的服务并发能力是很差的。

什么样的代码是同步 IO:

  • 没有开启一键协程化的时候,那么你的代码里面绝大部分涉及 IO 的操作都是同步 IO 的,协程化后,就会变成异步 IO,进程不会傻等在那里,参考协程调度
  • 有些 IO 是没法一键协程化,没法将同步 IO 变为异步 IO 的,例如 MongoDB(相信 Swoole 会解决这个问题),需要写代码时候注意。

协程 是为了提高并发的,如果我的应用就没有高并发,或者必须要用某些无法异步化 IO 的操作 (例如上文的 MongoDB),那么你完全可以不开启一键协程化,关闭 enable_coroutine,多开一些 Worker 进程,这就是和 Fpm/Apache 是一样的模型了,值得一提的是由于 Swoole 是 常驻进程 的,即使同步 IO 性能也会有很大提升,实际应用中也有很多公司这样做。

同步变为异步参看:https://wiki.swoole.com/#/learn

进程间数据共享:共享内存表  https://wiki.swoole.com/#/memory/table(包含很多基础知识,值得一看)

协程间通信:Channel  通道,用于协程间通讯,支持多生产者协程和多消费者协程。底层自动实现了协程的切换和调度。waitgroup可协调时间。

https://wiki.swoole.com/#/coroutine/wait_group

上下文同步:多协程共用一个&$resulet;

什么是 EventLoop

所谓 EventLoop,即事件循环,可以简单的理解为 epoll_wait,会把所有要发生事件的句柄(fd)加入到 epoll_wait 中,这些事件包括可读,可写,出错等。

对应的进程就阻塞在 epoll_wait 这个内核函数上,当发生了事件 (或超时) 后 epoll_wait 这个函数就会结束阻塞返回结果,就可以回调相应的 PHP 函数,例如,收到客户端发来的数据,回调 onReceive 回调函数。

当有大量的 fd 放入到了 epoll_wait 中,并且同时产生了大量的事件,epoll_wait 函数返回的时候就会挨个调用相应的回调函数,叫做一轮事件循环,即 IO 多路复用,然后再次阻塞调用 epoll_wait 进行下一轮事件循环。

Master 进程、Reactor 线程、Worker 进程、Task 进程、Manager 进程的区别与联系


Hyperf

协程上下文:由于同一个进程内协程间是内存共享的,但协程的执行/切换是非顺序的,也就意味着我们很难掌控当前的协程是哪一个*(事实上可以,但通常没人这么干)*,所以我们需要在发生协程切换时能够同时切换对应的上下文。
在 Hyperf 里实现协程的上下文管理将非常简单,基于 Hyperf\Utils\Context 类的 set(string $id, $value)get(string $id, $default = null)has(string $id)override(string $id, \Closure $closure) 静态方法即可完成上下文数据的管理,通过这些方法设置和获取的值,都仅限于当前的协程,在协程结束时,对应的上下文也会自动跟随释放掉,无需手动管理,无需担忧内存泄漏的风险。

「三年博客,如果觉得我的文章对您有用,请帮助本站成长」

赞(0) 打赏

支付宝
微信
0

支付宝
微信
标签:

上一篇:

下一篇:

你可能感兴趣

共有 0 - Swoole和hyperf

博客简介

精彩评论

  • admin(6年前 (2020-03-09))

    分别用不同厚度的筏板定义,画图后这设置筏板变截面处理。 http://f.fwxgx.co...

    评:新文章!
  • admin(6年前 (2020-03-09))

    分别用不同厚度的筏板定义,画图后这设置筏板变截面处理。 http://f.fwxgx.co...

    评:新文章!
  • admin(6年前 (2020-03-09))

    新增一个框架图! http://biji.jinli.vip/wp-content/upl...

    评:新文章!
  • 一位WordPress评论者(6年前 (2020-02-13))

    嗨,这是一条评论。 要开始审核、编辑及删除评论,请访问仪表盘的“评论”页面。 评论者头像来自...

    评:世界,您好!